.TITLE PRDRV .IDENT /03.01/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 03.01 ; ; THOMAS J. MILLER 2-DEC-74 ; ; PREVIOUSLY MODIFIED BY: ; ; C. A. D'ELIA ; ; MODIFIED BY: ; ; K. E. KINNEAR 22-JUN-77 ; ; KK004 -- NEW I/O DATA BASE SUPPORT. ; ; E. L. BAATZ 18-JUN-78 ; ; EB148 -- REMOVE EXPLICIT PS REFERENCE ; ; PC11/PR11 PAPER TAPE READER DRIVER ; ; MACRO LIBRARY CALLS ; .MCALL ABODF$,HWDDF$,PKTDF$ ABODF$ ;DEFINE TASK ABORT CODES HWDDF$ ;DEFINE HARDWARE REGISTER SYMBOLS PKTDF$ ;DEFINE I/O PACKET OFFSETS ; ; EQUATED SYMBOLS ; ; PAPER TAPE READER STATUS WORD BIT DEFINITIONS (U.CW2) ; TRAIL=100000 ;CURRENTLY READING TRAILER ; ;**-16 ; DRIVER DISPATCH TABLE ; ; KK004 DDT$ PR,P$$R11 ; KK004 ;**-4 ;+ ; **-PRINI-PC11/PR11 PAPER TAPE READER CONTROLLER INITIATOR ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEST ; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU- ; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPT ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IS ; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER- ; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED. ; ; INPUTS: ; ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; OUTPUTS: ; ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- ; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER- ; ATION IS INITIATED. ;- .ENABL LSB PRINI: GTPKT$ PR,P$$R11,PRPWF,,T ; KK004 ;**-2 ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1=ADDRESS OF THE I/O REQUEST PACKET. ; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX. ; R4=ADDRESS OF THE STATUS CONTROL BLOCK. ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; PAPER TAPE READER I/O REQUEST PACKET FORMAT: ; ; WD. 00 -- I/O QUEUE THREAD WORD. ; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER. ; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK. ; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER. ; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB). ; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.ATT OR IO.DET). ; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK. ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK. ; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000). ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; WD. 12 -- RELOCATION BIAS OF I/O BUFFER. ; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. ; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED. ; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED. ; WD. 20 -- NOT USED. ; MOVB I.FCN+1(R1),R2 ;MOVE FUNCTION CODE TO R2 ;**-1 CMPB R2,#IO.RLB/256. ;READ LOGICAL BLOCK FUNCTION? BEQ 10$ ;IF EQ YES MOV #IS.SUC&377,R0 ;OTHER FUNCTIONS ALWAYS SUCCEED CLR R1 ;RETURN 0 IN SECOND WORD OF STATUS BUFFER CMPB R2,#IO.ATT/256. ;ATTACH FUNCTION? BNE 50$ ;IF NE NO, CALL $IODON BIS #TRAIL,U.CW2(R5) ;SET FLAG TO READ TRAILER IF ATTACH BR 60$ ;CALL $IODON 10$: MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT COUNT TST @S.CSR(R4) ;ERROR BIT SET IN STATUS REGISTER? BPL 15$ ;IF PL NO, INITIATE IO TST U.CW2(R5) ;IS THIS THE FIRST READ FOR ATTACHED PROCESS? BMI 70$ ;IF MI YES, RETURN DEVICE NOT READY CODE ; (OTHERWISE HANDLE AS EOF UPON INTERRUPT) 15$: MOV #101,@S.CSR(R4) ;ENABLE READER WITH INTERRUPTS ; ; IN-PROGRESS TRANSFERS ARE NOT TERMINATED. ; PRCAN: ; ; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSES ; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITION ; THAT COULD EXIST IN RESTARTING THE I/O OPERATION ; PRPWF: RETURN ; ;+ ; **-$PRINT-PC11/PR11 PAPER TAPE READER CONTROLLER INTERUPTS ;- $PRINT:: ;;;REF LABEL INTSV$ PR,PR4,P$$R11 ;;;GENERATE INTERRUPT SAVE CODE MOV U.SCB(R5),R4 ;;;GET ADDRESS OF STATUS CONTROL BLOCK MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT MOV S.CSR(R4),R4 ;;;POINT R4 TO CONTROL STATUS REGISTER MOV (R4)+,U.CW3(R5) ;;;SAVE STATUS BMI 40$ ;;;IF MI, ERROR TST U.CW2(R5) ;;;READING TRAILER? BPL 20$ ;;;IF PL NO TSTB (R4) ;;;IS BYTE READ A NULL? BEQ 30$ ;;;IF EQ YES CLR U.CW2(R5) ;;;NO LONGER READING TRAILER 20$: MOVB (R4),-(SP) ;;;PUSH BYTE READ CALL $PTBYT ;;;PLACE IT IN USER BUFFER DEC U.CNT(R5) ;;;DECREMENT BYTE COUNT BEQ 40$ ;;;IF EQ READ COMPLETE 30$: INC -(R4) ;;;ENABLE READER JMP $INTXT ;;;EXIT FROM INTERRUPT 40$: CLR -(R4) ;;;DISABLE INTERRUPTS CALL $FORK ;;;CREATE SYSTEM PROCESS MOV U.SCB(R5),R4 ;POINT R4 TO SCB MOV S.PKT(R4),R1 ;POINT R1 TO I/O PACKET MOV I.PRM+4(R1),R1 ; AND PICK UP CHARACTER COUNT SUB U.CNT(R5),R1 ;CALCULATE CHARACTERS TRANSFERRED MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFER TST U.CW3(R5) ;DEVICE ERROR? BPL 50$ ;IF PL NO MOV #IE.EOF&377,R0 ;RETURN END OF FILE CODE 50$: CLR U.CW2(R5) ;CLEAR FLAG WORD 60$: CALL $IODON ;INITIATE I/O COMPLETION BR PRINI ;BRANCH BACK FOR NEXT REQUEST ; ; DEVICE TIMEOUT RESULTS IN THE RETURN OF A DEVICE NOT READY ERROR CODE. ; PROUT: CLR @S.CSR(R4) ;;;DISABLE READER INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTS 70$: MOV #IE.DNR&377,R0 ;DEVICE NOT READY CODE BR 50$ ;CALL $IODON .DSABL LSB .END